/**
 * 封装全局 axios 的请求
 * */

// 导入实例
import request from './request'

const http = {

  /**
   * 封装get请求
   * @param url 请求地址
   * @param param 请求参数
   */
  get(url, param){
    const config = {
      method: 'get',
      url: url,
      // 是否存在文件, false 不存在文件，true 存在文件
      existingFile: false,
    }

    if (param){
      config.params = param;
    }
    return request(config)
  },

  /**
   * 封装post请求
   * @param url 请求地址
   * @param param 请求参数
   */
  post(url, param){
    const config = {
      method: 'post',
      url: url,
      // 是否存在文件, false 不存在文件，true 存在文件
      existingFile: false,
    }
    if (param){
      config.data = param
    }
    return request(config)
  },

  /**
   * post 提交带文件的上传，同时上传文件和表单数据
   * @param url 请求地址
   * @param param 参数，使用
   *      let fromData = new FormData()
   //  参数为对象时， 使用 JSON.stringify 转字符串
   fromData.append('operation', JSON.stringify( pamram))
   fromData.append('files',uploadFiles[i])
   */
  postFileForm(url, param){
    const config = {
      method: 'post',
      url: url,
      // 是否存在文件, false 不存在文件，true 存在文件
      existingFile: true,
      // data: param
    }
    if (param){
      config.data = param
    }
    return request(config)
  },

  /**
   * 封装 put 请求
   * @param url 请求地址
   * @param param 请求参数
   */
  put(url, param){
    const config = {
      method: 'put',
      url: url,
      // 是否存在文件, false 不存在文件，true 存在文件
      existingFile: false,
    }

    if (param){
      config.params = param
    }
    return request(config)
  },

  /**
   * 文件下载方法（支持自动解析文件名）只适合下载文件，会自动触发浏览器下载行为。不是用于获取文件流并在页面上显示
   // 方式1：简单下载
   http.download('/fileStorage/downOutStreamById', { id: '123' });

   // 方式2：指定文件名
   http.download('/fileStorage/downOutStreamById', { id: '123' }, '自定义文件名.pdf');

   // 方式3：处理下载结果
   http.download('/fileStorage/downOutStreamById', { id: '123' })
   .then(() => {
   this.$message.success('下载成功');
   })
   .catch(() => {
   this.$message.error('下载失败');
   });

   * @param {string} url 请求地址
   * @param {object} params 请求参数
   * @param {string} fileName 可选，指定下载文件名
   * @param {string} method 请求方法，默认post
   */
  download(url, params = {}, fileName = null, method = 'post') {
    const config = {
      method,
      url,
      responseType: 'blob',
      headers: {
        'Accept': 'application/octet-stream'
      }
    };

    // 处理参数
    if (method.toLowerCase() === 'get') {
      config.params = params;
    } else {
      config.data = params;
    }

    return request(config).then(response => {
      // 验证是否为blob数据
      if (!(response.data instanceof Blob)) {
        throw new Error('无效的响应数据格式');
      }

      // 创建下载链接
      const blob = response.data;
      const downloadUrl = window.URL.createObjectURL(blob);
      const link = document.createElement('a');

      // 解析文件名
      let finalFileName = fileName || this.parseFilenameFromResponse(response) || 'file';

      // 设置下载属性
      link.href = downloadUrl;
      link.download = finalFileName;
      link.style.display = 'none';

      // 触发下载
      document.body.appendChild(link);
      link.click();

      // 清理
      setTimeout(() => {
        document.body.removeChild(link);
        window.URL.revokeObjectURL(downloadUrl);
      }, 100);

      return {
        success: true,
        fileName: finalFileName,
        blob: blob
      };
    });
  },
  /**
   * 从响应头解析文件名
   * @param {object} response 响应对象
   */
  parseFilenameFromResponse(response) {
    const contentDisposition = response.headers['content-disposition'];
    if (!contentDisposition) return null;

    // 处理 RFC5987 编码的文件名
    const utf8Filename = contentDisposition.match(/filename\*=(?:UTF-8''|'')([^;]+)/i);
    if (utf8Filename && utf8Filename[1]) {
      return decodeURIComponent(utf8Filename[1]);
    }

    // 处理普通文件名
    const filenameMatch = contentDisposition.match(/filename="?([^;"]+)"?/i);
    if (filenameMatch && filenameMatch[1]) {
      return filenameMatch[1];
    }

    return null;
  },

  /**
   * 根据文件ID获取图片URL（适合直接在el-image中使用）
   * @param {string} fileId 文件ID
   */
  getImageUrl(fileId) {
    return request({
      method: 'get',
      url: '/fileStorage/downOutStreamById',
      params: { id: fileId },
      responseType: 'blob'
    }).then(res => {
      if (!res || !res.data) return null;
      return URL.createObjectURL(res.data)
    }).catch(e => {
      console.error('加载图片失败:', e);
      return null;
    })
  },

}

// 暴露出去
export default http
